package trabajoPracticoCalculadora;

import junit.framework.Assert;

import org.junit.Test;

public class CalculadoraTest {

	private Calculadora calculadora = new Calculadora();

	@Test
	public void crearUnaCalculadoraVerificarResultadoPorDefectoTest() {
		Assert.assertNotNull("Objeto Calculadora Creado", calculadora);
		double resultadoEsperado = this.calculadora.getResultado();
		Assert.assertEquals("Resultado por defecto ", 0.0, resultadoEsperado);
	}

	@Test
	public void sumarDosNumerosTest() {

		String[] expresion = new String[] { "2", "+", "5" };

		double solucion = 7;
		this.calculadora.evaluar(expresion);

		double resultadoEcuacion = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion,
				resultadoEcuacion, 0.0001);
	}

	@Test
	public void multiplicarDosNumerosTest() {
		String[] expresion = new String[] { "2", "*", "5" };

		double solucion = 10;
		this.calculadora.evaluar(expresion);

		double resultado = this.calculadora.getResultado();
		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				0.00001);
	}

	@Test
	public void restarNumeroDespuesDeSumaTest() {
		String[] expresion = new String[] { "2", "+", "2", "-", "20" };
		double solucion = -16;

		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				0.0001);
	}

	@Test
	public void dividirLuegoDeMultiplicarDosNumerosTest() {
		String[] expresion = new String[] { "2", "*", "2", "/", "20" };
		double solucion = (2.0 * 2.0 / 20.0);

		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test
	public void FactorComunTest() {
		String[] expresion = new String[] { "(", "6", "+", "59", ")", "*", "2" };
		double solucion = 130;

		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test
	public void factorComun2Test() {
		String[] expresion = new String[] { "2", "*", "(", "6", "+", "59", ")" };
		double solucion = 130;

		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test
	public void distributivaTest() {
		String[] expresion = new String[] { "(", "6", "+", "59", ")", "*", "(",
				"85", "-", "10", ")" };
		double solucion = 4875;

		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test
	public void expresionMixta1Test() {

		String[] expresion = new String[] { "(", "(", "15", "+", "20", ")",
				"*", "(", "10", "/", "2", ")", ")", "+", "200" };

		double solucion = 375;
		this.calculadora.evaluar(expresion);
		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test
	public void expresionMixta2Test() {

		String[] expresion = new String[] { "200", "+", "(", "(", "15", "*",
				"20", ")", "+", "(", "10", "/", "2", ")", ")" };

		double solucion = 505;
		this.calculadora.evaluar(expresion);

		double resultado = this.calculadora.getResultado();

		Assert.assertEquals("Resultado de Ecuacion", solucion, resultado,
				.00001);
	}

	@Test(expected = IllegalArgumentException.class)
	public void probarDivisionPorCeroTest() {
		Calculadora calculadora = new Calculadora();
		String[] expresion = new String[] { "2", "/", "0" };
		calculadora.evaluar(expresion);
	}

	@Test(expected = IllegalArgumentException.class)
	public void probarDivisionPorCeroEnCalculoConOperadoresMixtosTest() {
		Calculadora calculadora = new Calculadora();

		String[] expresion = new String[] { "(", "(", "0", "+", "1", "+", "0",
				"+", "5", "+", "0", "*", "1", ")", ")", "/", "0" };

		calculadora.evaluar(expresion);
	}
}
